package net.suncaper.mvc.service.impl;

import net.suncaper.mvc.exception.BusinessException;
import net.suncaper.mvc.mapper.HotelMapper;
import net.suncaper.mvc.mapper.impl.HotelMapperImpl;
import net.suncaper.mvc.model.domain.Hotel;
import net.suncaper.mvc.service.IHotelService;
import net.suncaper.mvc.utils.JDBCUtils;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.ScalarHandler;

import java.math.BigDecimal;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;

/**
 * 酒店业务接口实现类
 */
public class HotelServiceImpl implements IHotelService {
    private final HotelMapper hotelMapper = new HotelMapperImpl();
    private static final QueryRunner RUNNER = new QueryRunner();

    /**
     * 添加酒店
     *
     * @param hotel 酒店信息
     * @return 添加结果
     */
    @Override
    public boolean addHotel(Hotel hotel) {
        // 校验必填字段
        if (hotel.getHotelName() == null) {
            throw new BusinessException("酒店信息不完整，请补充必要信息");
        }

        // 检查酒店是否已存在
        Hotel existingHotel = hotelMapper.getHotelByName(hotel.getHotelName());
        if (existingHotel != null) {
            throw new BusinessException("该酒店已存在");
        }

        return hotelMapper.insertHotel(hotel);
    }

    /**
     * 根据酒店名称获取酒店信息
     *
     * @param hotelName 酒店名称
     * @return 酒店信息
     */
    @Override
    public Hotel getHotelByName(String hotelName) {
        return hotelMapper.getHotelByName(hotelName);
    }

    /**
     * 获取所有酒店信息
     *
     * @return 酒店列表
     */
    @Override
    public List<Hotel> getAllHotels() {
        return hotelMapper.getAllHotels();
    }

    /**
     * 根据国家和城市筛选酒店
     *
     * @param country 国家
     * @param city    城市
     * @return 酒店列表
     */
    @Override
    public List<Hotel> getHotelsByLocation(String country, String city) {
        return hotelMapper.getHotelsByLocation(country, city);
    }

    /**
     * 根据评分筛选酒店
     *
     * @param minRating 最低评分
     * @param maxRating 最高评分
     * @return 酒店列表
     */
    @Override
    public List<Hotel> getHotelsByRating(BigDecimal minRating, BigDecimal maxRating) {
        // 校验参数
        if (minRating == null || maxRating == null) {
            throw new BusinessException("评分范围不能为空");
        }
        
        if (minRating.compareTo(maxRating) > 0) {
            throw new BusinessException("最低评分不能大于最高评分");
        }

        return hotelMapper.getHotelsByRating(minRating, maxRating);
    }

    /**
     * 更新酒店信息
     *
     * @param hotel 酒店信息
     * @return 更新结果
     */
    @Override
    public boolean updateHotel(Hotel hotel) {
        // 校验酒店是否存在
        Hotel existingHotel = hotelMapper.getHotelByName(hotel.getHotelName());
        if (existingHotel == null) {
            throw new BusinessException("要更新的酒店不存在");
        }

        return hotelMapper.updateHotel(hotel);
    }

    /**
     * 删除酒店
     *
     * @param hotelName 酒店名称
     * @return 删除结果
     */
    @Override
    public boolean deleteHotel(String hotelName) {
        // 校验酒店是否存在
        Hotel existingHotel = hotelMapper.getHotelByName(hotelName);
        if (existingHotel == null) {
            throw new BusinessException("要删除的酒店不存在");
        }

        // 检查酒店是否有关联的房间
        // 此处省略具体实现，实际项目中需要处理关联数据

        return hotelMapper.deleteHotel(hotelName);
    }
    
    /**
     * 根据用户ID获取其管理的酒店名称
     *
     * @param userId 用户ID
     * @return 酒店名称，如果用户不是酒店商家则返回null
     */
    @Override
    public String getHotelNameByUserId(String userId) {
        String sql = "SELECT hotel_name FROM user_role WHERE user_id = ? AND role_id = 2";
        Connection connection = JDBCUtils.getConnection();
        String hotelName = null;
        try {
            hotelName = RUNNER.query(
                    connection,
                    sql,
                    new ScalarHandler<>(),
                    userId
            );
        } catch (SQLException e) {
            throw new RuntimeException(e);
        } finally {
            JDBCUtils.close();
        }
        return hotelName;
    }
    
    /**
     * 根据酒店名称获取酒店拥有者ID
     *
     * @param hotelName 酒店名称
     * @return 酒店拥有者ID，如果酒店不存在则返回null
     */
    @Override
    public String getHotelOwnerIdByName(String hotelName) {
        if (hotelName == null || hotelName.trim().isEmpty()) {
            throw new BusinessException("酒店名称不能为空");
        }
        
        String sql = "SELECT user_id FROM user_role WHERE hotel_name = ? AND role_id = 2";
        Connection connection = JDBCUtils.getConnection();
        String ownerId = null;
        
        try {
            ownerId = RUNNER.query(
                connection,
                sql,
                new ScalarHandler<>(),
                hotelName
            );
        } catch (SQLException e) {
            throw new RuntimeException(e);
        } finally {
            JDBCUtils.close();
        }
        
        return ownerId;
    }
    
    /**
     * 更新酒店评分
     *
     * @param hotelName 酒店名称
     * @param rating 新的评分
     * @return 更新结果
     */
    @Override
    public boolean updateHotelRating(String hotelName, BigDecimal rating) {
        // 校验酒店是否存在
        Hotel existingHotel = hotelMapper.getHotelByName(hotelName);
        if (existingHotel == null) {
            throw new BusinessException("要更新评分的酒店不存在");
        }
        
        // 更新评分
        return hotelMapper.updateHotelRating(hotelName, rating);
    }

    /**
     * 根据用户ID获取酒店信息
     *
     * @param userId 用户ID
     * @return 酒店信息，如果用户不是酒店商家则返回null
     */
    @Override
    public Hotel getHotelByUserId(String userId) {
        if (userId == null || userId.trim().isEmpty()) {
            throw new BusinessException("用户ID不能为空");
        }
        return hotelMapper.getHotelByUserId(userId);
    }
}    